package main

import (
	"bufio"
	"fmt"
	"golang.org/x/net/html/charset"
	"golang.org/x/text/encoding"
	"golang.org/x/text/transform"
	"io"
	"io/ioutil"
	"net/http"
	"regexp"
)

func main() {
	resp, err := http.Get("http://www.zhenai.com/zhenghun")
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		fmt.Println("状态码错误！", resp.StatusCode)
		return
	}


	// 第一个方式：这个方式去的缺点是你必须知道这个编码是什么，也就是你确定他是gbk格式
	// 如果是 gbk 格式，则进行转码为utf8
	// 转码格式包 golang.org/x/text
	// utf8Reader := transform.NewReader(resp.Body, simplifiedchinese.GBK.NewDecoder())
	// all, err := ioutil.ReadAll(utf8Reader)

	// 第二个方式：通过官方库进行判断 golang/x/net 里面的html包
	e := determineEncoding(resp.Body)
	// 转码格式包 golang.org/x/text
	utf8Reader := transform.NewReader(resp.Body, e.NewDecoder())
	all, err := ioutil.ReadAll(utf8Reader)

	// 这里是直接打印出来，在上面是做了编码转换，防止数据流不是UTF8格式
	//all, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	//fmt.Printf("%s\n", all)

	// 转换为字符串
	s := string(all)
	//fmt.Println(s, "类型是：",reflect.TypeOf(s))

	// 获取城市
	getCity(s)



}

// 判断网页是什么编码格式
func determineEncoding(r io.Reader) encoding.Encoding {
	// 创建新的 io 流，因为网络流只能读取一次，所以要创建一个新的读取，也就是包装复制一个流
	// 取前 1024 个字节
	bytes, err := bufio.NewReader(r).Peek(1024)
	if err != nil {
		panic(err)
	}

	// 判断网页是什么编码格式
	e, name, certain := charset.DetermineEncoding(bytes, "")
	fmt.Printf("判断网页编码；encoding:%v, 名称：%s, bool：%v\n", e, name, certain)
	return e

}

// 获取城市
func getCity(s string) {
	// 匹配规则
	// [^>] 表示匹配不是 ">" 的，*表示一次或者多次
	// 也就是不等于 ">" 的字符可以有一个也可以有多个，也可以一个都没有
	re := regexp.MustCompile(`<a href="(http://www.zhenai.com/zhenghun/[0-9a-z]+)" [^>]*>([^<]+)</a>`)
	reString := re.FindAllStringSubmatch(s, -1)
	//fmt.Println(reString[0])
	for index, item:= range reString {
		//fmt.Printf("坐标：%v, 值：%s\n", index, item)
		fmt.Printf("坐标:%v, %v, %v\n", index,item[1], item[2])
	}
}
